#include "ready_queue.h"
#include <stdlib.h>

void 
enqueue_task( task_rq *rq, pcb* task )
{
	if( is_empty(rq) ) { 

		rq->front = rq->rear = task; 
		//가장 앞에 잇으므로 prev는 Null이 된다.
		task->list.prev = NULL;

	} else {

		//rear의 next에 새로운 task를 입력
		rq->rear->list.next = &(task->list);
		//이전 rear에 있던 rear를 새로운 task의 prev에 둔다.
		task->list.prev = &(rq->rear->list);
		//현재 rear는 task이다
		rq->rear = task;
	}

	task->list.next = NULL;

	++rq->size;
}

pcb *
dequeue_task( task_rq *rq )
{
	pcb *front_task = rq->front;
	node *next_front_task = rq->front->list.next;

	if( !is_empty(rq) ) {

		if( rq->front == rq->rear ) {
			rq->front = rq->rear = NULL;
		} else {

        	  	//결국 front.list를 말하는것이고 front.list를 NULL로 한다 즉, 맨 앞을 비운다.	
			rq->front->list.next->prev = NULL;
		
		  	//기존 front의 next에 있던 task를 front가 가리킨다			
			rq->front = list_entry(next_front_task, pcb, list);
		}      

		--rq->size;
	}
	
	return front_task;
}

int
is_empty( task_rq *rq ) 
{
	return rq->size == 0;
}

int 
get_queue_size( task_rq *rq )
{
	return rq->size;
}

pcb *
get_first_task( task_rq *rq )
{
	return rq->front;
}

pcb *
get_last_task( task_rq *rq )
{
	return rq->rear;
}

task_rq *
init_task_queue()
{
	task_rq *task_queue = (task_rq *) malloc ( sizeof(task_rq) );	

	task_queue->front = task_queue->rear = NULL;
	task_queue->size = 0;

	return task_queue;
}

void
clear_queue( task_rq *rq )
{
	while( !is_empty( rq ) ) {
		dequeue_task( rq );
	}
}

pcb* create_node( int NewData)
{
	pcb* Newnode = (pcb*)malloc(sizeof(pcb));
	Newnode->pid = NewData;
	Newnode->list.prev =  NULL;
	Newnode->list.next = NULL;

	return Newnode;
}

/*void
get_mode ( const void *cmd_pararm )
{
    int run_mode = atoi( (char *)cmd_param );
            
            switch(run_mode) {
                case FCFS : break;
		        case SJF : break;
        		case RR : break;
            }
}*/
        

